#include "uBroadcast.h"

#include <stdio.h>
#include <string.h>

void ub_clear(uMessage * msg) {
	bzero(msg->buffer, UB_BUFFER_SIZE * sizeof(uint8_t));
	msg->ptr = msg->buffer + 2;
	msg->checksum = 0x00;
}

void ub_flush(uMessage * msg) {
	*msg->ptr = msg->checksum;
}

int ub_check(uMessage * msg) {
	uint8_t *ptr = msg->buffer + 2;
	uint8_t checksum = 0x00;
	while (ptr < msg->ptr) {
		checksum ^= *ptr++;
	}
	return checksum == msg->checksum;
}

int ub_write_char(uMessage * msg, char c) {
	if (UB_SIZE(msg) == UB_DATA_SIZE) {
		return 1;
	}
	msg->checksum ^= (*msg->ptr++ = c);
	UB_SIZE(msg)++;
	return 0;
}

int ub_write_str(uMessage * msg, char * str) {
	while (*str != '\0') {
		if (UB_SIZE(msg) == UB_DATA_SIZE) {
			return 1;
		}
		msg->checksum ^= (*(msg->ptr)++ = *str++);
		UB_SIZE(msg)++;
	}
	return 0;
}

int ub_cmp(uMessage * msg1, uMessage * msg2) {
	int i = 0;
	for (; i < UB_DATA_SIZE && i <= UB_SIZE(msg2) + 2; i++) {
		int res = msg1->buffer[i] - msg2->buffer[i];
		if (res) {
			return res;
		}
	}
	return 0;
}

void ub_cpy(uMessage * dest, uMessage * src) {
	if (!dest || !src) {
		return;
	}
	dest->checksum = src->checksum;
	memcpy(dest->buffer, src->buffer, UB_BUFFER_SIZE * sizeof(uint8_t));
	dest->ptr = dest->buffer + (UB_SIZE(src));
}

/** Warning: Will flush data */
void ub_debug(uMessage * msg) {
	ub_flush(msg);
	printf("---- ---- ---- ---- ---- ---- ---- ----\n");
//	printf("Message type: %d\nMessage size: %d\n", UB_TYPE(msg), UB_SIZE(msg));
	unsigned int i = 0;
	for (; i < UB_SIZE(msg) + 3; i++) {
		if (i && i % 8 == 0) {
			printf("\n");
		}
		printf("0x%02.2x ", msg->buffer[i] & 0x0ff);
	}
	if (!ub_check(msg)) {
		printf("\n/!\\ Invalid /!\\\n");
	} else {
		printf("\n");
	}
}
